package com.lfb.io_stream;

import java.io.*;

public class CharIOStream {
    public static void main(String[] args) {
//        test01();
        test02();
    }

    /**
     * 字符流的应用：带有Buffer的输入输出流
     * 写出时，需要单独去写
     */
    private static void test02(){
        try {
            // 创建一个文件输入流对象,第二个参数指定编码格式
            BufferedReader fis = new BufferedReader(
                    new InputStreamReader(
                            new FileInputStream(
                                    new File("D:\\temp\\iotest\\filein02.txt")),"GBK"));
            // 创建一个文件输出流对象
            // 注意：第二个参数默认是false，表示每次从文件的开头开始写入内容，也就是覆盖写；
            //       如果第二个参数是true，表示每次从文件的末尾开始写，也就是末尾追加写；
            BufferedWriter fos = new BufferedWriter(
                    new OutputStreamWriter(
                            new FileOutputStream("D:\\temp\\iotest\\filein0222_2_out.txt",true),"GBK")) ;


            // 将文件流对象中的内容读取到程序中
            String strLine = fis.readLine();
            // 判断是否读取到文件末尾
            while(strLine != null){
                // 输出读取的内容

                System.out.println(strLine);
                // 使用文件输出流对象，将内容写出到指定文件中
                fos.write(strLine);//写出内容末尾没有换行符，需要手动写换行符
                fos.newLine();//换行
                // 继续向下读取内容(否则进入死循环)
                strLine = fis.readLine();
            }
            // 文件输出流写完之后，在文件默认追加一个换行符；

            fos.newLine();//换行
            // 关闭资源
            // 也可以写在finally部分进行资源回收
            if(fis != null) {
                fis.close();
            }
            // 清空输出流
            if (fos !=null) {
                fos.flush();
                fos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 字符流的应用：文件输入流
     */
    private static void test01(){
        try {
            // 创建一个文件输入流对象
            InputStreamReader fis = new InputStreamReader(new FileInputStream("D:\\temp\\iotest\\filein01.txt"),"GBK");
            // 创建一个文件输出流对象
            // 注意：第二个参数默认是false，表示每次从文件的开头开始写入内容，也就是覆盖写；
            //       如果第二个参数是true，表示每次从文件的末尾开始写，也就是末尾追加写；
            OutputStreamWriter fos =new OutputStreamWriter(new FileOutputStream("D:\\temp\\iotest\\filein0222_out.txt",true),"GBK") ;

            // 创建一个读取文件输入流中的流数据的容器数组
            char[] chars = new char[1024];
            // 将文件流对象中的内容读取到程序中
            int len = fis.read(chars);
            // 判断是否读取到文件末尾
            while(len != -1){
                // 输出读取的内容
                String strLine = new String(chars,0,len);
                System.out.println(strLine);
                // 使用文件输出流对象，将内容写出到指定文件中
                fos.write(chars,0,len);

                // 重新清理读取的容器数组
                //chars = new char[1024];
                // 继续向下读取内容(否则进入死循环)
                len = fis.read(chars);
            }
            // 文件输出流写完之后，在文件默认追加一个换行符；
            //fos.write('\n');
            fos.write(("\n".toCharArray())[0]);
            // 关闭资源
            // 也可以写在finally部分进行资源回收
            if(fis != null) {
                fis.close();
            }
            // 清空输出流
            if (fos !=null) {
                fos.flush();
                fos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
